#!/bin/bash

# 自动化测试脚本 - 代码变更后自动运行测试
# 使用方法：./auto-test-after-changes.sh [测试类型]

set -e  # 遇到错误立即退出

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${BLUE}ℹ️  $1${NC}"
}

log_success() {
    echo -e "${GREEN}✅ $1${NC}"
}

log_warning() {
    echo -e "${YELLOW}⚠️  $1${NC}"
}

log_error() {
    echo -e "${RED}❌ $1${NC}"
}

log_step() {
    echo -e "\n${BLUE}🔍 $1${NC}"
    echo "=================================================="
}

# 显示帮助信息
show_help() {
    echo "🚀 自动化测试脚本 - 代码变更后自动运行测试"
    echo ""
    echo "使用方法:"
    echo "  $0 [测试类型]"
    echo ""
    echo "测试类型:"
    echo "  full      - 完整测试（需要服务器运行）"
    echo "  demo      - 真实数据测试（需要服务器运行）"
    echo "  quick     - 快速测试（检查环境和依赖）"
    echo "  validate  - 验证测试（检查代码完整性）"
    echo "  all       - 运行所有测试类型"
    echo ""
    echo "示例:"
    echo "  $0 full      # 运行完整测试"
    echo "  $0 demo      # 运行演示测试"
    echo "  $0 all       # 运行所有测试"
    echo ""
    echo "💡 提示: 如果不指定测试类型，将自动选择合适的测试模式"
}

# 检查环境
check_environment() {
    log_step "检查运行环境"
    
    # 检查Node.js
    if ! command -v node &> /dev/null; then
        log_error "Node.js 未安装"
        exit 1
    fi
    log_success "Node.js 已安装: $(node --version)"
    
    # 检查npm
    if ! command -v npm &> /dev/null; then
        log_error "npm 未安装"
        exit 1
    fi
    log_success "npm 已安装: $(npm --version)"
    
    # 检查必要文件
    local required_files=(
        "client-test-simulator.js"
        "demo-client-test.js"
        "client-test-config.json"
        "package.json"
    )
    
    for file in "${required_files[@]}"; do
        if [ ! -f "$file" ]; then
            log_error "必要文件不存在: $file"
            exit 1
        fi
    done
    log_success "所有必要文件存在"
}

# 安装依赖
install_dependencies() {
    log_step "检查并安装依赖"
    
    if [ ! -d "node_modules/ws" ]; then
        log_warning "ws模块未安装，正在安装..."
        npm install ws
        if [ $? -eq 0 ]; then
            log_success "ws模块安装成功"
        else
            log_error "ws模块安装失败"
            exit 1
        fi
    else
        log_success "ws模块已安装"
    fi
    
    # 检查其他可能需要的依赖
    if [ ! -d "node_modules/node-fetch" ]; then
        log_warning "node-fetch模块未安装，正在安装..."
        npm install node-fetch
        if [ $? -eq 0 ]; then
            log_success "node-fetch模块安装成功"
        else
            log_warning "node-fetch模块安装失败，可能影响HTTP测试"
        fi
    fi
}

# 检查服务器状态
check_server_status() {
    log_step "检查服务器状态"
    
    if curl -s http://localhost:3000/health > /dev/null 2>&1; then
        log_success "服务器正在运行 (http://localhost:3000)"
        return 0
    elif curl -s http://localhost:3000 > /dev/null 2>&1; then
        log_warning "服务器正在运行，但健康检查接口不可用"
        return 0
    else
        log_warning "服务器未启动 (http://localhost:3000)"
        return 1
    fi
}

# 运行快速测试
run_quick_test() {
    log_step "运行快速测试"
    
    # 检查脚本语法
    log_info "检查JavaScript语法..."
    if node -c client-test-simulator.js; then
        log_success "client-test-simulator.js 语法正确"
    else
        log_error "client-test-simulator.js 语法错误"
        return 1
    fi
    
    if node -c demo-client-test.js; then
        log_success "demo-client-test.js 语法正确"
    else
        log_error "demo-client-test.js 语法错误"
        return 1
    fi
    
    # 检查配置文件
    log_info "检查配置文件..."
    if node -e "JSON.parse(require('fs').readFileSync('client-test-config.json', 'utf8'))" 2>/dev/null; then
        log_success "client-test-config.json 格式正确"
    else
        log_error "client-test-config.json 格式错误"
        return 1
    fi
    
    log_success "快速测试通过"
    return 0
}

# 运行真实数据测试
run_real_data_test() {
    log_step "运行真实数据测试"
    
    log_info "执行真实数据测试..."
    if node demo-client-test.js; then
        log_success "真实数据测试通过"
        return 0
    else
        log_error "真实数据测试失败"
        return 1
    fi
}

# 运行完整测试
run_full_test() {
    log_step "运行完整测试"
    
    if ! check_server_status; then
        log_warning "服务器未运行，无法执行完整测试"
        log_info "建议先启动服务器："
        log_info "  cd nestjs-app && npm run start:dev"
        return 1
    fi
    
    log_info "执行完整测试..."
    if node client-test-simulator.js; then
        log_success "完整测试通过"
        return 0
    else
        log_error "完整测试失败"
        return 1
    fi
}

# 运行验证测试
run_validate_test() {
    log_step "运行验证测试"
    
    local all_passed=true
    
    # 验证文件完整性
    log_info "验证文件完整性..."
    local files_to_check=(
        "client-test-simulator.js"
        "demo-client-test.js"
        "client-test-config.json"
        "package.json"
        "run-client-test-improved.sh"
        "CLIENT_TEST_README.md"
        "TROUBLESHOOTING.md"
        "CLIENT_TEST_SUMMARY.md"
        "README_NEW.md"
    )
    
    for file in "${files_to_check[@]}"; do
        if [ -f "$file" ]; then
            log_success "✓ $file"
        else
            log_error "✗ $file (缺失)"
            all_passed=false
        fi
    done
    
    # 验证脚本权限
    log_info "验证脚本权限..."
    if [ -x "run-client-test-improved.sh" ]; then
        log_success "✓ run-client-test-improved.sh 可执行"
    else
        log_warning "⚠️  run-client-test-improved.sh 不可执行"
        chmod +x run-client-test-improved.sh
        log_info "已修复权限"
    fi
    
    # 验证依赖
    log_info "验证依赖..."
    if [ -d "node_modules/ws" ]; then
        log_success "✓ ws模块已安装"
    else
        log_warning "⚠️  ws模块未安装"
        all_passed=false
    fi
    
    if [ "$all_passed" = true ]; then
        log_success "验证测试通过"
        return 0
    else
        log_error "验证测试失败"
        return 1
    fi
}

# 运行所有测试
run_all_tests() {
    log_step "运行所有测试类型"
    
    local results=()
    
    # 1. 快速测试
    log_info "1/4 运行快速测试..."
    if run_quick_test; then
        results+=("快速测试: ✅")
    else
        results+=("快速测试: ❌")
    fi
    
    # 2. 验证测试
    log_info "2/4 运行验证测试..."
    if run_validate_test; then
        results+=("验证测试: ✅")
    else
        results+=("验证测试: ❌")
    fi
    
    # 3. 演示测试
    log_info "3/4 运行演示测试..."
    if run_demo_test; then
        results+=("演示测试: ✅")
    else
        results+=("演示测试: ❌")
    fi
    
    # 4. 完整测试
    log_info "4/4 运行完整测试..."
    if run_full_test; then
        results+=("完整测试: ✅")
    else
        results+=("完整测试: ❌")
    fi
    
    # 输出结果汇总
    log_step "测试结果汇总"
    for result in "${results[@]}"; do
        echo "$result"
    done
    
    # 统计结果
    local passed=$(echo "${results[@]}" | grep -o "✅" | wc -l)
    local total=${#results[@]}
    local success_rate=$((passed * 100 / total))
    
    echo ""
    echo "📊 测试统计:"
    echo "   总计: $total 个测试"
    echo "   通过: $passed 个"
    echo "   失败: $((total - passed)) 个"
    echo "   成功率: ${success_rate}%"
    
    if [ $passed -eq $total ]; then
        log_success "🎉 所有测试通过！"
        return 0
    else
        log_warning "⚠️  部分测试失败，请检查相关功能"
        return 1
    fi
}

# 自动选择测试模式
auto_select_test() {
    log_step "自动选择测试模式"
    
    if check_server_status; then
        log_info "检测到服务器运行，选择完整测试模式"
        run_full_test
    else
        log_info "服务器未运行，选择真实数据测试模式"
        run_real_data_test
    fi
}

# 主函数
main() {
    echo "🚀 自动化测试脚本启动"
    echo "=================================================="
    
    # 检查环境
    check_environment
    
    # 安装依赖
    install_dependencies
    
    # 根据参数选择测试类型
    case "${1:-auto}" in
        "full")
            log_info "选择完整测试模式"
            run_full_test
            ;;
        "demo")
            log_info "选择真实数据测试模式"
            run_real_data_test
            ;;
        "quick")
            log_info "选择快速测试模式"
            run_quick_test
            ;;
        "validate")
            log_info "选择验证测试模式"
            run_validate_test
            ;;
        "all")
            log_info "选择全部测试模式"
            run_all_tests
            ;;
        "auto"|"")
            log_info "自动选择测试模式"
            auto_select_test
            ;;
        "help"|"-h"|"--help")
            show_help
            exit 0
            ;;
        *)
            log_error "未知的测试类型: $1"
            show_help
            exit 1
            ;;
    esac
    
    local exit_code=$?
    
    echo ""
    echo "=================================================="
    if [ $exit_code -eq 0 ]; then
        log_success "测试执行完成！"
    else
        log_error "测试执行失败！"
    fi
    echo "=================================================="
    
    exit $exit_code
}

# 捕获中断信号
trap 'echo -e "\n${YELLOW}⚠️  测试被中断${NC}"; exit 1' INT TERM

# 运行主函数
main "$@" 